NOTE
1.1 make vs new
1. 是什么 golang的内置函数 2. 为什么需要 分配内存空间 值类型的声明之后即可使用 引用类型的则需要分配空间 3. 使用 3.1. new 开辟一段内存,并置为零值,返回指向该类型内存地址的指针 3.1.1. 相当于&结构体{} 3.2. make 用于创建slice、map和chann
这是历史学习笔记,可能存在过时或不完整的理解。
1. 是什么
golang的内置函数
2. 为什么需要
分配内存空间
值类型的声明之后即可使用
func TestVars(t *testing.T) {
var i int
var s string
fmt.Println(i, s)
}
//输出
0
引用类型的则需要分配空间
func TestVars2(t *testing.T) {
var i *int
fmt.Println(i)
fmt.Println(*i)
}
//输出
<nil>
--- FAIL: TestVars2 (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x5098cf]
3. 使用
3.1. new
开辟一段内存,并置为零值,返回指向该类型内存地址的指针
func TestNew(t *testing.T) {
var i *int
i = new(int)
fmt.Println(*i)
}
//输出
0
3.1.1. 相当于&结构体{}
type Stu struct {
//名字
name string
}
func testNew() {
f := new(Stu) //其实就是*f = &Stu{},所以一般不使用new
f.TestPrintName()
f.SetName("zsk")
f.TestPrintName()
}
3.2. make
用于创建slice、map和channel 开辟一段内存,会初始化而不是置为零值(引用类型零值是nil),返回值类型而不是指针(因为slice、map、channel就是引用类型,没必要返回指向他们的指针了)
func TestMake(t *testing.T) {
fmt.Println(makeSlice())
}
func makeSlice() []int {
return make([]int, 0)
}
4. new vs make
| make | new | |
|---|---|---|
| 作用 | 分配堆内存 | 分配堆内存 |
| 参数 | 用于slice、map以及channel的初始化 | 用于类型的内存分配,并且内存置为零 |
| 返回 | 三个引用类型本身 | 指向类型的指针 |
5. 原理
5.1. new
func TestNew(t *testing.T) {
var i *int
i = new(int)
fmt.Println(*i)
}
//输出
0
- go tool compile -S
0x0024 00036 (make1_test.go:14) PCDATA $0, $1
0x0024 00036 (make1_test.go:14) PCDATA $1, $0
0x0024 00036 (make1_test.go:14) LEAQ type."".Stu(SB), AX
0x002b 00043 (make1_test.go:14) PCDATA $0, $0
0x002b 00043 (make1_test.go:14) MOVQ AX, (SP)
0x002f 00047 (make1_test.go:14) CALL runtime.newobject(SB)
0x0034 00052 (make1_test.go:14) PCDATA $0, $1
0x0034 00052 (make1_test.go:14) MOVQ 8(SP), AX
调用了runtime.newobject(SB)
5.2. make
func TestMake(t *testing.T) {
fmt.Println(makeSlice())
}
func makeSlice() []int {
return make([]int, 0)
}
- go tool compile -S
0x002f 00047 (make1_test.go:13) PCDATA $0, $0
0x002f 00047 (make1_test.go:13) MOVQ AX, (SP)
0x0033 00051 (make1_test.go:13) XORPS X0, X0
0x0036 00054 (make1_test.go:13) MOVUPS X0, 8(SP)
0x003b 00059 (make1_test.go:13) CALL runtime.makeslice(SB)
0x0040 00064 (make1_test.go:13) PCDATA $0, $1
0x0040 00064 (make1_test.go:13) MOVQ 24(SP), AX
调用了runtime.makeslice(SB)